package com.vcoud.mundialbrasil2014;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

import android.database.Cursor;
import android.database.SQLException;
import android.os.AsyncTask;
import android.os.AsyncTask.Status;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ExpandableListView;
import android.widget.Toast;

import com.vcoud.mbrasil2014.R;
import com.vcoud.mundialbrasil2014.adapter.GrupoExpandibleAdapter;

public class GrupoFragment extends Fragment {
	List<String> listaGrupo;
	Map<String, ArrayList<HashMap<String, String>>> coleccionGrupo;
	ExpandableListView listaExpandible;
	DB db;
	static final String KEY_ID = "IDEquipo";
	static final String KEY_NOMBRE = "Nombre";
	static final String KEY_BANDERA = "Bandera";
	static final String KEY_COLOR = "Color";
	static final String KEY_GANADOS = "Ganados";
	static final String KEY_EMPATADOS = "Empatados";
	static final String KEY_PERDIDOS = "Perdidos";
	static final String KEY_CAMISA = "Camisa";
	static final String KEY_PUNTOS = "Puntos";
	static final String KEY_GOLESFAVOR = "GolesFavor";
	static final String KEY_GOLESCONTRA = "GolesContra";
	static final String KEY_DIFERENCIAGOLES = "DiferenciaGoles";

	ActualizacionService actualizacion;
	ActualizarSegundoPlano actualizar = new ActualizarSegundoPlano();
	Boolean actualizacionFinalizada = true;
	GrupoExpandibleAdapter grupoExpandibleAdapter;

	public GrupoFragment() {
	}

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setHasOptionsMenu(true);
		actualizacion = new ActualizacionService(getActivity());
		actualizacion.actualizarEquiposHoy();
	}

	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		View rootView = inflater.inflate(R.layout.fragment_grupo, container,
				false);

		crearGrupo();
		crearColeccion();
		listaExpandible = (ExpandableListView) rootView
				.findViewById(R.id.lista_grupo);
		grupoExpandibleAdapter = new GrupoExpandibleAdapter(getActivity(),
				listaGrupo, coleccionGrupo);
		listaExpandible.setAdapter(grupoExpandibleAdapter);
		for (int i = 0; i < listaGrupo.size(); i++) {
			listaExpandible.expandGroup(i);
		}
		return rootView;
	}

	@Override
	public void onPause() {
		super.onPause();
		getActivity().setProgressBarIndeterminateVisibility(false);
		if (actualizar.getStatus() == Status.RUNNING) {
			actualizar.cancel(true);
		}

	}

	@Override
	public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
		super.onCreateOptionsMenu(menu, inflater);
		getActivity().getMenuInflater().inflate(R.menu.grupos, menu);
	}

	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		switch (item.getItemId()) {
		case R.id.grupos_expandir:
			for (int i = 0; i < listaGrupo.size(); i++) {
				listaExpandible.expandGroup(i);
			}
			return true;
		case R.id.grupos_contraer:
			for (int i = 0; i < listaGrupo.size(); i++) {
				listaExpandible.collapseGroup(i);
			}
		case R.id.action_refresh:
			actualizar = new ActualizarSegundoPlano();
			actualizar.execute();
			return true;
		default:
			return super.onOptionsItemSelected(item);
		}
	}

	private void crearGrupo() {
		listaGrupo = new ArrayList<String>();
		listaGrupo.add("A");
		listaGrupo.add("B");
		listaGrupo.add("C");
		listaGrupo.add("D");
		listaGrupo.add("E");
		listaGrupo.add("F");
		listaGrupo.add("G");
		listaGrupo.add("H");
	}

	private void crearColeccion() {
		coleccionGrupo = new LinkedHashMap<String, ArrayList<HashMap<String, String>>>();
		db = new DB(getActivity());
		db.abrir();
		for (String grupo : listaGrupo) {
			Cursor mCursor = db.obtenerGrupo(grupo);
			ArrayList<HashMap<String, String>> tmpGrupo = new ArrayList<HashMap<String, String>>();

			if (mCursor.getCount() > 0 && mCursor.moveToFirst()) {
				do {
					HashMap<String, String> mGrupo = new HashMap<String, String>();
					try {
						mGrupo.put(KEY_ID, mCursor.getString(0));
						mGrupo.put(KEY_NOMBRE, mCursor.getString(1));
						mGrupo.put(KEY_BANDERA, mCursor.getString(2));
						mGrupo.put(KEY_GANADOS, mCursor.getString(8));
						mGrupo.put(KEY_EMPATADOS, mCursor.getString(9));
						mGrupo.put(KEY_PERDIDOS, mCursor.getString(10));
						mGrupo.put(KEY_PUNTOS, mCursor.getString(12));
						mGrupo.put(KEY_GOLESFAVOR, mCursor.getString(13));
						mGrupo.put(KEY_DIFERENCIAGOLES, mCursor.getString(15));
					} catch (SQLException e) {
						e.printStackTrace();
					}
					tmpGrupo.add(mGrupo);
				} while (mCursor.moveToNext());

				coleccionGrupo.put(grupo, tmpGrupo);
			} else {
				HashMap<String, String> mGrupo = new HashMap<String, String>();
				mGrupo.put(KEY_ID, "0");
				mGrupo.put(KEY_NOMBRE,
						getActivity().getString(R.string.inicio_sin_conexion));
				mGrupo.put(KEY_BANDERA, "");
				mGrupo.put(KEY_GANADOS, "");
				mGrupo.put(KEY_EMPATADOS, "");
				mGrupo.put(KEY_PERDIDOS, "");
				mGrupo.put(KEY_PUNTOS, "");
				mGrupo.put(KEY_GOLESFAVOR, "");
				mGrupo.put(KEY_DIFERENCIAGOLES, "");
				tmpGrupo.add(mGrupo);
				coleccionGrupo.put(grupo, tmpGrupo);
			}
		}
		db.cerrar();
	}

	@Override
	public void onPrepareOptionsMenu(Menu menu) {
		menu.findItem(R.id.action_refresh).setVisible(actualizacionFinalizada);
	}

	private class ActualizarSegundoPlano extends
			AsyncTask<String, Void, Boolean> {

		@Override
		protected void onPreExecute() {
			getActivity().setProgressBarIndeterminateVisibility(true);
			actualizacionFinalizada = false;
			getActivity().invalidateOptionsMenu();
			Toast.makeText(getActivity().getBaseContext(),
					getString(R.string.inicio_actualizando), Toast.LENGTH_SHORT)
					.show();
		}

		@Override
		protected Boolean doInBackground(String... equipos) {

			return actualizacion.actualizarEquipo();
		}

		@Override
		protected void onPostExecute(Boolean result) {
			if (result) {
				crearGrupo();
				crearColeccion();
				grupoExpandibleAdapter.actualizar(listaGrupo, coleccionGrupo);
				// final FragmentTransaction ft = getActivity()
				// .getSupportFragmentManager().beginTransaction();
				// Fragment fr = null;
				// fr = getActivity().getSupportFragmentManager()
				// .findFragmentByTag("fragment_grupo");
				// ft.detach(fr).attach(fr).commit();
				actualizacionFinalizada = true;
				getActivity().invalidateOptionsMenu();
				getActivity().setProgressBarIndeterminateVisibility(false);
			} else {
				Toast.makeText(getActivity().getBaseContext(),
						getString(R.string.inicio_sin_conexion),
						Toast.LENGTH_SHORT).show();
				actualizacionFinalizada = true;
				getActivity().invalidateOptionsMenu();
				getActivity().setProgressBarIndeterminateVisibility(false);
			}
		}
	}

}
